package com.bjsxt.common.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.springframework.stereotype.Component;

/**
 * 文件工具类
 * @author wangshSxt
 *
 */
@Component("fileUtil")
public class FileUtil
{
	/**
	 * 复制文件
	 * @param sourceFile
	 * @param targetFile
	 * @return
	 */
	public boolean copy(File sourceFile,File targetFile)
	{
		if(!targetFile.getParentFile().exists())
		{
			targetFile.getParentFile().mkdirs();
		}
		
		BufferedInputStream bis = null ; 
		BufferedOutputStream bos = null ; 
		try
		{
			bis = new BufferedInputStream(new FileInputStream(sourceFile));
			bos = new BufferedOutputStream(new FileOutputStream(targetFile));
			return this.copy(bis, bos);
		} catch (IOException e)
		{
			e.printStackTrace();
		}finally
		{
			try
			{
				bos.close();
			} catch (IOException e)
			{
				e.printStackTrace();
			}
			try
			{
				bis.close();
			} catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		return false ; 
	}
	
	/**
	 * 复制文件
	 * @param sourceFile
	 * @param targetFile
	 * @return
	 */
	public boolean copy(InputStream is,OutputStream os)
	{
		BufferedInputStream bis = null ; 
		BufferedOutputStream bos = null ; 
		try
		{
			bis = new BufferedInputStream(is);
			bos = new BufferedOutputStream(os);
			byte[] b = new byte[1024];
			int len = 0 ; 
			while((len = bis.read(b)) != -1)
			{
				bos.write(b, 0, len);
			}
			return true ; 
		} catch (IOException e)
		{
			e.printStackTrace();
		}finally
		{
			try
			{
				bos.close();
			} catch (IOException e)
			{
				e.printStackTrace();
			}
			try
			{
				bis.close();
			} catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		return false ; 
	}
	
	/**
	 * 以树形结构展现一个文件夹
	 * 
	 * @param souFile
	 */
	public void tree(File souFile)
	{
		System.out.println("============");
		this.treeUtil(souFile,0);
	}
	
	/**
	 * 树形结构的递归
	 * ~肯定是自己调用自己
	 * ~得满足一定条件才能自己调用自己,否则出不来
	 * ~参数必须得发生变化,否则调用相当于白调
	 * ~名称前面加上表示级别的字符串;如何让层级动起来;
	 * ~传参(用来存储信息)
	 */
	public void treeUtil(File tempFile,int level)
	{
		/**
		 * 前面的树形结构层级:
		 */
		String preStr = "" ; 
		for (int i = 0; i < level; i++)
		{
			preStr += "|-->";
		}
		System.out.println(preStr + tempFile.getName());
		if(tempFile.isDirectory())
		{
			/* 列出当前文件夹下面的文件或者文件夹 */
			File[] files = tempFile.listFiles();
			for (int i = 0; i < files.length; i++)
			{
				File file = files[i];
				/* 什么情况下,需要自己调用自己
				 * 只有是文件夹的时候才调用自己
				 * 参数:传递的应该是当前文件夹下面的文件;如果传的还是当前文件;(相当于递归木有调用)
				 *  */
				this.treeUtil(file,level + 1 );
			}
		}
	}
	
	public static void main(String[] args)
	{
		File souFile = new File("D:/项目空间/405_20161031/框架");
		FileUtil fileUtil = new FileUtil();
		fileUtil.tree(souFile);
	}
}
